"""
私有属性
    在属性前面添加 __就是私有属性,
    在Python中，私有属性是一种约定俗成的机制，
    用于限制对类内部属性的直接访问。Python没有真正的私有属性（像Java或C++那样的严格访问控制），
    而是通过命名约定和一些机制来实现类似效果。

应用场景
    有些变量不允许 外部随意修改，我们可以把这部分变量变成私有属性，并提供相应的get set方法
    这种情况就叫做封装
"""

class Person:

    def __init__(self, name, age,money):
        self.name = name
        self.__age = age
        self.__money = money

    def set_money(self,money):
        if type(money) != float:
            print('钱必须是float类型')
            return
        self.__money = money

    def get_money(self):
        return self.__money

    def set_age(self,age):
        if type(age) !=int:
            print('年龄必须是int类型')
            return
        if age < 0:
            print('年龄不能小于0')
            return
        self.__age = age

    def get_age(self):
        return self.__age

    def __str__(self):
        return f'Person(name={self.name},age={self.__age},money={self.__money})'


if __name__ == '__main__':
    p = Person('聂茹凤',19,2000)
    # p.set_age(22)
    # print(p.get_age())
    #
    # p.set_money(90000)
    # print(p.get_money())



    # print(p.__str__()) # 一般不会手动调用，也可以手动调用
    # print(str(p))  # 也可以这么写，也是调用 __str__

    # print(p)

    # print(p.__age) # 报错 私有属性在外部不能直接使用
    # p.__age = 20 # 私有属性在外部可以访问，但是赋值无效

    print(p._Person__age)  # 外部如果要访问私有属性 必须 _类名__属性名

    print(p)